<!DOCTYPE html>
<style>
  body {
    margin: 0;
    padding: 0;
  }

  #nonFastRegion {
    height: 222px;
    width: 222px;
    border: none;
    overflow: scroll;
    -webkit-transform: translateX(0);
  }

  #nonFastRegion > div {
    height: 1000px;
    width: 1000px;
    background: linear-gradient(to bottom, red, white);
  }

  .spacer {
    height: 2000px;
  }
</style>
<script>
  // Prefer non-composited scrolling because this is a test of non-composited
  // scrollers.
  if (window.internals)
    internals.settings.setPreferCompositingToLCDTextEnabled(false);
</script>
<div id='nonFastRegion'><div>This should be covered by a green overlay.</div></div>

<p>A single square should be visible covered by a green overlay.</p>
<div id="console"></div>
<div class="spacer"></div>

<script src="../resources/js-test.js"></script>
<script src="../resources/run-after-layout-and-paint.js"></script>
<script src="resources/non-fast-scrollable-region-testing.js"></script>
<script>
  jsTestIsAsync = true;
  // print result lazily to avoid layouts during the test
  setPrintTestResultsLazily();
  description('This test ensures that transforming a non-fast scrollable area ' +
    'correctly updates list of non-fast scrollable rects ' +
    '(See http://crbug.com/417345).');

  onload = function() {
    runAfterLayoutAndPaint(runTests);
  };

  function runTests() {
    nonFastScrollableRects = internals.nonFastScrollableRects(document);
    shouldBe('nonFastScrollableRects.length', '1');
    shouldBeEqualToString('rectToString(nonFastScrollableRects[0])', '[0, 0, 222, 222]');

    document.body.style.padding = "10px";
    debug("Trigger style update");
    shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "1");
    debug("Verifying layout hasn't been triggered");
    shouldBe("internals.needsLayoutCount()", "3");

    // Updating transforms hits an optimized layout path which is root cause of
    // http://crbug.com/417345
    debug("Update non-fast element's transform");
    document.getElementById('nonFastRegion').style.webkitTransform = 'translateX(100px)';

    debug("Trigger style update");
    shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "1");
    debug("Verifying layout still hasn't been triggered");
    shouldBe("internals.needsLayoutCount()", "3");
    debug("Verifying non-fast regions have been updated");
    // Note: querying non-fast regions forces layout, so the expectation
    // reflects the change to body element padding.
    nonFastScrollableRects = internals.nonFastScrollableRects(document);
    shouldBe('nonFastScrollableRects.length', '1');
    shouldBeEqualToString('rectToString(nonFastScrollableRects[0])', '[110, 10, 222, 222]');

    setTimeout(function() {
      // Add green overlays to help visualize the test
      drawNonFastScrollableRegionOverlays();
      finishJSTest();
    }, 0);
  }
</script>
